#ifndef PLC_TYPE_H_
#define PLC_TYPE_H_

/***************************************************************
 * @file       PLC_Type.h
 * @brief      PLC_Type类是所有类型类的基类，所有具体的类型类都间接或直接继承自这个类。
 * @author     chh
 * @version    0.1
 * @date       2022.4.16
 * @modify      无
 * @reason      无
 **************************************************************/

#include<string>
#include"PLC_Object.h"


class PLC_Value;

/*类型类基类*/
class PLC_Type : public PLC_Object 
{
	private:
		/*类型标识符*/
		int _i_typeId;
		/*数据的大小,单位Byte*/
		int _i_size;
		/*类型名称*/
		std::string _str_typeName;

	public:
        using PLC_Object::PLC_Object;

    	virtual ~PLC_Type(){}

		/***************************************************************
		 *  @brief     设置类型标识符
		 *  @param     i_typeId:新的类型标识符  
		 **************************************************************/
		void setTypeId(int i_typeId);

		/***************************************************************
		 *  @brief     	获取类型标识符
		 *  @return		值类的类型标识符(int类型)
		 **************************************************************/
		int getTypeId();

		/***************************************************************
		 *  @brief     设置类型标识符
		 *  @param     i_size:新的类型大小  
		 **************************************************************/
		void setSize(int i_size);

		/***************************************************************
		 *  @brief     	获取类型标识符
		 *  @return		值类的类型大小(int类型)
		 **************************************************************/
    	int getSize();

		/***************************************************************
		 *  @brief     	设置类型名称
		 *  @param		str_name:新的类型名称
		 **************************************************************/
		void setTypeName(std::string str_name);
		
		/***************************************************************
		 *  @brief     	获得类型名称
		 *  @return		值类的类型名称(std::string类型)
		 **************************************************************/
		std::string getTypeName();

        auto transformVariable(PLC_Value* var);


    public:
		/***************************************************************
		 *  @brief     	调用值类的构造函数,在堆内创建类型类对应的值类对象，此函数的调用者需要负责释放创建出的对象	
		 *  @return		新创建的值类的引用
		 **************************************************************/
    	virtual PLC_Value* createValue()=0;

		/***************************************************************
		 *  @brief     	深度拷贝,调用值类的构造函数,在堆内创建类型类对应的值类对象，此函数的调用者需要负责释放创建出的对象	
		 *  @return		新创建的值类的引用
		 *  @param      resource:拷贝源
		 **************************************************************/
    	virtual PLC_Value* createValue(PLC_Value* resource)=0;

        /**
         * 类型类的深拷贝函数
         * */
        virtual PLC_Type* deepCloneType() = 0;
};

#endif